package com.shujia;

import java.io.*;
import java.util.ArrayList;

/**
 * 前提：假设每一行数据是1M,文件大小是1000M,将来会产生8个block块
 */
public class SplitFileBlock {
    public static void main(String[] args) throws IOException {
        //1、将文件读取进来
        //IO流：输入流，因为students.txt是一个文本文件，所以用字符流，这里使用BufferedReader读取数据
        //输出流：BufferedWriter
        BufferedReader br = new BufferedReader(new FileReader("data/bigstudents.txt"));
        //定义一个序号，表示往哪一个文件写（这里的文件模拟的是一个block块）
        int index = 0;
        //创建一个字符缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("data/blocks/block---" + index));

        //定义一个变量记录读取了多少行
        int rowNum = 0;

        //定义一个集合存储已经读到的数据
        //又因为将来需要根据索引往指定的block文件中写数据
        //使用ArrayList集合
        ArrayList<String> list = new ArrayList<>();

        //定义一个变量记录索引的变化
        //这个变化直接影响到每一个block块的开始写入位置
        int startIndex = 0;

        //开始编写生成block块的逻辑
        //当读取的数据达到128*1.1，大概是140M的时候，生成一个block块
        String line = null;
        while ((line = br.readLine()) != null) {
            //每次读取一行，读取的行数+1
            rowNum++;
            //将读取到的数据放入集合中，为了今后取数据写入到文件中做准备
            list.add(line);
            //当读取的行数达到140的时候开始执行生成block块文件
            if (rowNum == 1400000) {
                startIndex = 1280000 * index;
                for(int i=startIndex;i<=startIndex+1279999;i++){
                    bw.write(list.get(i));
                    bw.newLine();
                    bw.flush();
                }
                rowNum = 120000;
                index++;
                bw = new BufferedWriter(new FileWriter("data/blocks/block---" + index));
            }
        }

        //将剩下的数据写入到一个block块文件中
        for(int i = list.size()-rowNum;i<list.size();i++){
            bw.write(list.get(i));
            bw.newLine();
            bw.flush();
        }

        //释放资源
        bw.close();
        br.close();



    }
}
